package com.base.cn.platform.os.service.course.qa.question;

import com.base.cn.platform.os.entity.qa.question.QaQuestion;
import com.base.cn.platform.os.entity.qa.question.QuestionCondition;
import com.base.cn.platform.os.service.FeignAuthConfig;
import com.base.cn.platform.os.service.course.CourseBaseService;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * 问答接口
 * @author LIZHIPENG
 * @since 2018/4/11
 */
@FeignClient(name = CourseBaseService.appName ,configuration = FeignAuthConfig.class)
public interface QaQuestionService extends CourseBaseService {

    /**
     * 查询试题数量
     * @param question 查询条件
     * @return 试题数量
     */
    @RequestMapping(contextPath + "/questionCount")
    BigDecimal questionCount(@RequestBody Map<String, Object> question);

    /**
     * 多条件查询问答
     * @param condition 查询条件
     * @param qaTypeData 是否设置问答类型数据
     * @param teacherData 是否设置问答老师数据
     * @param createUserData 是否设置创建的用户数据
     * @param qaAddData 是否设置追问数据
     * @param attendData 是否设置围观数据
     * @param tagData 是否设置标签数据
     * @param teacherPriceData 是否设置老师分成数据
     * @return  List<QaQuestion>
     */
    @RequestMapping(contextPath + "/findQuestionList")
    List<Map<String,Object>> findQuestionList(@RequestBody Map<String, Object> condition,
                                              @RequestParam("qaTypeData") boolean qaTypeData,
                                              @RequestParam("teacherData") boolean teacherData,
                                              @RequestParam("createUserData") boolean createUserData,
                                              @RequestParam("qaAddData") boolean qaAddData,
                                              @RequestParam("attendData") boolean attendData,
                                              @RequestParam("tagData") boolean tagData,
                                              @RequestParam("teacherPriceData") boolean teacherPriceData);

    /**
     * 分页查询问题列表
     * @param currentPage 页码
     * @param pageSize 每页显示数量
     * @param question 条件
     * @param userId 用户ID
     * @param qaTypeData 是否设置问答分类数据： true：是， false：否
     * @param teacherData 是否设置讲师数据： true：是， false：否
     * @param createUserData 是否设置提问人数据： true：是， false：否
     * @return
     */
    @RequestMapping(contextPath + "/queryQuestionListPage")
    Map<String, Object> queryQuestionListPage(@RequestParam(value = "currentPage", required = false, defaultValue = "1") int currentPage,
                                              @RequestParam(value = "pageSize", required = false, defaultValue = "10") int pageSize,
                                              @RequestBody Map<String, Object> question,
                                              @RequestParam(value = "userId", required = false, defaultValue = "0") BigDecimal userId,
                                              @RequestParam("qaTypeData") boolean qaTypeData,
                                              @RequestParam("teacherData") boolean teacherData,
                                              @RequestParam("createUserData") boolean createUserData,
                                              @RequestParam("qaAddData") boolean qaAddData,
                                              @RequestParam("attendData") boolean attendData,
                                              @RequestParam("tagData") boolean tagData,
                                              @RequestParam("teacherPriceData") boolean teacherPriceData,
                                              @RequestParam("replyUser") boolean replyUser);

    /**
     * 根据ID查询问题
     * @param questionId 问题ID
     * @return
     */
    @RequestMapping(contextPath + "/findQuestionById")
    QaQuestion findQuestionById(@RequestParam("questionId") BigDecimal questionId,
                                @RequestParam("qaTypeData") boolean qaTypeData,
                                @RequestParam("teacherData") boolean teacherData,
                                @RequestParam("createUserData") boolean createUserData,
                                @RequestParam("qaAddData") boolean qaAddData,
                                @RequestParam("attendData") boolean attendData,
                                @RequestParam("tagData") boolean tagData,
                                @RequestParam("teacherPriceData") boolean teacherPriceData);

    /**
     * 根据ID查询问题列表，并把列表转成Map
     * @param ids 问题ID串
     * @param qaTypeData 是否查询问答分类数据  true：是， false：否
     * @param teacherData 是否查询受问讲师数据  true：是， false：否
     * @param createUserData 是否查询提问人数据  true：是， false：否
     * @param qaAddData 是否查询追问数据  true：是， false：否
     * @return Map<BigDecimal,QaQuestion>
     */
    @RequestMapping(contextPath + "/findQuestionToMapByIds")
    Map<BigDecimal,Map<String, Object>> findQuestionToMapByIds(@RequestParam("ids") String ids,
                                                               @RequestParam("qaTypeData") boolean qaTypeData,
                                                               @RequestParam("teacherData") boolean teacherData,
                                                               @RequestParam("createUserData") boolean createUserData,
                                                               @RequestParam("qaAddData") boolean qaAddData,
                                                               @RequestParam("attendData") boolean attendData,
                                                               @RequestParam("tagData") boolean tagData,
                                                               @RequestParam("teacherPriceData") boolean teacherPriceData);

    /**
     * 根据ID查询问题列表，并把列表转成Map
     * @param condition 查询条件
     * @return Map<BigDecimal,QaQuestion>
     */
    @RequestMapping(contextPath + "/findQuestionToMap")
    Map<BigDecimal,QaQuestion> findQuestionToMap(@RequestBody QuestionCondition condition);


    /**
     * 根据ID查询要支付的问题列表，并把列表转成Map
     * @param ids 问题ID串
     * @param qaTypeData 是否查询问答分类数据  true：是， false：否
     * @param teacherData 是否查询受问讲师数据  true：是， false：否
     * @param createUserData 是否查询提问人数据  true：是， false：否
     * @param qaAddData 是否查询追问数据  true：是， false：否
     * @return Map<BigDecimal,QaQuestion>
     */
    @RequestMapping(contextPath + "/findPayQuestionMaps")
    Map<BigDecimal,Map<String,Object>> findPayQuestionMaps(@RequestParam("ids") String ids,
                                                           @RequestParam("qaTypeData") boolean qaTypeData,
                                                           @RequestParam("teacherData") boolean teacherData,
                                                           @RequestParam("createUserData") boolean createUserData,
                                                           @RequestParam("qaAddData") boolean qaAddData,
                                                           @RequestParam("attendData") boolean attendData,
                                                           @RequestParam("tagData") boolean tagData,
                                                           @RequestParam("teacherPriceData") boolean teacherPriceData);

    /**
     * 根据ID查询问题列表
     * @param ids 问题ID串
     * @param qaTypeData 是否查询问答分类数据  true：是， false：否
     * @param teacherData 是否查询受问讲师数据  true：是， false：否
     * @param createUserData 是否查询提问人数据  true：是， false：否
     * @param qaAddData 是否查询追问数据  true：是， false：否
     * @return List<QaQuestion>
     */
    @RequestMapping(contextPath + "/findQuestionByIds")
    List<Map<String, Object>> findQuestionByIds(String ids,
                                                @RequestParam("qaTypeData") boolean qaTypeData,
                                                @RequestParam("teacherData") boolean teacherData,
                                                @RequestParam("createUserData") boolean createUserData,
                                                @RequestParam("qaAddData") boolean qaAddData,
                                                @RequestParam("attendData") boolean attendData,
                                                @RequestParam("tagData") boolean tagData,
                                                @RequestParam("teacherPriceData") boolean teacherPriceData);

    /**
     * 修改问题状态
     * @param questionIds 问题ID串
     * @param status 状态：1.恢复，2.禁用，3.删除
     * @return
     */
    @RequestMapping(contextPath + "/updateQuestionStatus")
    Map<String, Object> updateQuestionStatus(@RequestParam("questionIds") String questionIds,
                                             @RequestParam("status") int status);

    /**
     * 后台回答问题方法
     * @param question
     * @return
     */
    @RequestMapping(contextPath + "/saveQuestionReply")
    Map<String, Object> saveQuestionReply(@RequestBody Map<String, Object> question);

    /**
     * 前台查看问题详情方法
     * @param questionId 问题ID
     * @param userId 当前登录用户ID
     * @param qaTypeData 是否设置问答类型（true：是，false：否）
     * @param userData 是否设置提问用户信息（true：是，false：否）
     * @param teacherData 是否设置专家信息（true：是，false：否）
     * @param addData 是否设置追问信息（true：是，false：否）
     * @param attendData 是否设置旁听用户信息（true：是，false：否）
     * @param tagData 是否设置标签信息（true：是，false：否）
     * @return
     */
    @RequestMapping(contextPath + "/findQuestionByIdForFront")
    Map<String, Object> findQuestionByIdForFront(@RequestParam("questionId") BigDecimal questionId,
                                                 @RequestParam(value = "userId", required = false, defaultValue = "0") BigDecimal userId,
                                                 @RequestParam("qaTypeData") boolean qaTypeData,
                                                 @RequestParam("userData") boolean userData,
                                                 @RequestParam("teacherData") boolean teacherData,
                                                 @RequestParam("addData") boolean addData,
                                                 @RequestParam("attendData") boolean attendData,
                                                 @RequestParam("tagData") boolean tagData,
                                                 @RequestParam("teacherPriceData") boolean teacherPriceData);

    /**
     * 查询我的问答列表
     * @param currentPage 页码
     * @param pageSize 每页显示条数
     * @param userId 用户ID
     * @param queryType 查询类型：1.我提问的-免费，2.我回答(评论)的，3.我提问的-付费，4.我围观的
     * @param qaTypeData 是否设置问答类型（true：是，false：否）
     * @param userData 是否设置提问用户信息（true：是，false：否）
     * @param teacherData 是否设置专家信息（true：是，false：否）
     * @param addData 是否设置追问信息（true：是，false：否）
     * @param attendData 是否设置旁听用户信息（true：是，false：否）
     * @param tagData 是否设置标签信息（true：是，false：否）
     * @return
     */
    @RequestMapping(contextPath + "/queryMyQuestionList")
    Map<String, Object> queryMyQuestionList(@RequestParam(value = "currentPage", required = false, defaultValue = "1") int currentPage,
                                            @RequestParam(value = "pageSize", required = false, defaultValue = "10") int pageSize,
                                            @RequestParam("userId") BigDecimal userId,
                                            @RequestParam("queryType") int queryType,
                                            @RequestParam("qaTypeData") boolean qaTypeData,
                                            @RequestParam("userData") boolean userData,
                                            @RequestParam("teacherData") boolean teacherData,
                                            @RequestParam("addData") boolean addData,
                                            @RequestParam("attendData") boolean attendData,
                                            @RequestParam("tagData") boolean tagData,
                                            @RequestParam("teacherPriceData") boolean teacherPriceData);

    /**
     * 校验用户是否可以免费提问
     * @param userId 用户ID
     * @return
     */
    @RequestMapping(contextPath + "/checkUserIsQuestion")
    Map<String, Object> checkUserIsQuestion(@RequestParam("userId") BigDecimal userId);

    /**
     * 通过套餐ID查询课程列表
     * @param packageId 套餐ID
     * @return
     */
    @RequestMapping(contextPath + "/getCourseListByPackageId")
    Map<String, Object> getCourseListByPackageId(@RequestParam("packageId") BigDecimal packageId);

    /**
     * 根据课程ID查询章节列表
     * @param courseId 课程ID
     * @return
     */
    @RequestMapping(contextPath + "/getCourseCatalogByCourseId")
    Map<String, Object> getCourseCatalogByCourseId(@RequestParam("courseId") BigDecimal courseId);

    /**
     * 前台提问方法
     * @param question 问题内容
     * @return
     */
    @RequestMapping(contextPath + "/saveQuestion")
    Map<String, Object> saveQuestion(@RequestBody Map<String, Object> question);

    /**
     * 查询问答总数量数据
     * @return QaSumCount
     */
    @RequestMapping(contextPath + "/queryQaSumCount")
    Map<String, Integer> queryQaSumCount();


    /**
     * 根据用户id查询用户提问列表
     * @param userId 用户id
     * @return
     */
    @RequestMapping(contextPath + "/findQaQuestionByUserId")
    List<QaQuestion> findQaQuestionByUserId(@RequestParam("userId") BigDecimal userId);
}
